/**
 * R.js 核心类
 * 用于处理请求的响应
 * */
class R {
    /**
     * 构造器
     * @param req 请求
     * @param res 响应
     * @param requestType 请求类型 get 、 post
     * @param status 响应代码
     */
    constructor({ req , res , requestType , status }) {
        this.status = status || {
            success: 0,
            fail: 1,
            error: 2
        };
        this.res = res;
        this.req = req;
        this.requestType = requestType || 'get';
        this.content = {};
        this.errMessage = '';
        this.defaultStatus = this.status.success || 'success';
    }

    /**
     * 解析 req 的所有参数,
     * 解析后的字段有 param、header、url、cookies
     */
    analizeReq() {
        this.content = {
            param: this.req[this.requestType === 'get' ? 'query' : 'body'],
            header: this.req.headers,
            url: this.req.originalUrl,
            cookies: this.req.cookies
        };
        return this;
    }

    setError(err) {
        if (typeof err === 'string') {
            this.errMessage += '\n' + err;
        } else {
            this.errMessage += '\n' + (err.message || "error");
        }
        this.defaultStatus = this.status.error;
        return this;
    }

    /**
     * 检查状态是否合法
     * @param status 将被检查的状态值
     */
    checkStatus(status) {
        if (status) {
            if (status in this.status) {
            } else {
                this.status[status] = 'not found';
            }
            return status;
        } else {
            return this.defaultStatus;
        }
    }

    /**
     * 使用回设置的 res.json 方法返回 JSON 串
     * @param data 数据
     * @param status 状态
     */
    resCallBack(data, status) {
        this.res.json({
            status: this.checkStatus(status),
            data: data || {},
            allStatus: this.status,
            err: this.errMessage
        });
    }
}

module.exports = R;
